package com.bobo.controller;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bobo.base.PageParam;
import com.bobo.base.R;
import com.bobo.pojo.Prod;
import com.bobo.pojo.ProdTag;
import com.bobo.pojo.Sku;
import com.bobo.pojo.Transport;
import com.bobo.service.ProdService;
import com.bobo.service.SkuService;
import com.bobo.service.TransportService;
import com.bobo.util.Json;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/prod")
@Tag(name = "商品接口")
public class ProdController {
    @Resource
    private ProdService prodService;

    @Resource
    private SkuService skuService;

    @Resource
    private TransportService transportService;
    /**
     * 通过分组标签获取商品列表
     * 首页商品分组显示
     *
     * @param tagId 分组标签id
     * @param page  分页参数
     * @return 包含商品列表的分页响应实体
     */
    @GetMapping("/prodListByTagId")
    @Operation(summary = "通过分组标签获取商品列表" , description = "通过分组标签id（tagId）获取商品列表")
    @Parameters({
            @Parameter(name = "tagId", description = "当前页，默认为1" , required = true),
    })
    public R<IPage<Prod>> prodListByTagId(
            @RequestParam(value = "tagId") Long tagId, Page<Prod> page) {
        IPage<Prod> productPage = prodService.pageByTagId(page, tagId);
        return R.success(productPage);
    }

    /**
     * 首页显示的商品列表
     * @param categoryId
     * @param page
     * @return
     */
    @GetMapping("/pageProd")
    @Operation(summary = "通过分类id商品列表信息" , description = "根据分类ID获取该分类下所有的商品列表信息")
    @Parameters({
            @Parameter(name = "categoryId", description = "分类ID" , required = true),
    })
    public R<IPage<Prod>> prodList(
            @RequestParam(value = "categoryId") Long categoryId,PageParam<Prod> page) {
        IPage<Prod> productPage = prodService.pageByCategoryId(page, categoryId);
        return R.success(productPage);
    }

    /**
     * 获取首页所有标签商品列表
     *
     * @return 包含首页所有标签商品信息的响应实体
     */
    @GetMapping("/tagProdList")
    @Operation(summary = "首页所有标签商品接口" , description = "获取首页所有标签商品接口")
    public R<List<ProdTag>> getTagProdList() {
        // 调用 prodService 的 tagProdList 方法获取首页所有标签商品列表
        List<ProdTag> productDtoList = prodService.tagProdList();
        return R.success(productDtoList);
    }

    /**
     * 根据商品ID获取商品详情信息
     *
     * @param prodId 商品ID
     * @return 包含商品详情信息的响应实体
     */
    @GetMapping("/prodInfo")
    @Operation(summary = "商品详情信息" , description = "根据商品ID（prodId）获取商品信息")
    @Parameter(name = "prodId", description = "商品ID" , required = true)
    public R<Prod> prodInfo(Long prodId) {
        // 根据商品ID获取商品信息
        Prod product = prodService.getProductByProdId(prodId);
        // 如果商品信息为空，直接返回成功响应
        if (product == null) {
            return R.success();
        }
        // 根据商品ID获取商品的SKU列表
        List<Sku> skuList = skuService.listByProdId(prodId);
        // 启用的sku列表
        // 过滤出状态为启用（状态码为1）的SKU列表
        List<Sku> useSkuList = skuList.stream().filter(sku -> sku.getStatus() == 1).collect(Collectors.toList());
        // 将启用的SKU列表设置到商品信息中
        product.setSkuList(useSkuList);
        // 将商品信息复制到商品数据传输对象中
        Prod productDto = BeanUtil.copyProperties(product, Prod.class);
        // 商品的配送方式
        // 解析商品的配送方式信息
        Prod.DeliveryModeVO deliveryModeVO = Json.parseObject(product.getDeliveryMode(), Prod.DeliveryModeVO.class);
        // 有店铺配送的方式, 且存在运费模板，才返回运费模板的信息，供前端查阅
        // 如果有店铺配送方式且存在运费模板ID
        if (deliveryModeVO.getHasShopDelivery()  && product.getDeliveryTemplateId() != null) {
            // 根据运费模板ID获取运费模板及所有项信息
            Transport transportAndAllItems = transportService.getTransportAndAllItems(product.getDeliveryTemplateId());
            // 将运费模板信息设置到商品数据传输对象中
            productDto.setTransport(transportAndAllItems);
        }
        // 返回包含商品详情信息的成功响应
        return R.success(productDto);
    }
}
